Redshift IAM認証でのユーザーの自動作成を試してみる
はじめに
データアナリティクス事業本部のkobayashiです。
以前RedshiftのIAM認証を使用したデータベース接続の検証を行う記事を書きました。その時に行ったのは予めRedshiftでユーザーを作成し接続する際にそのユーザーを使うという方法でしたが、接続オプションにはRedshiftユーザーを自動作成するものがあるので今回はそちらを試してみたのでまとめます。
Redshiftのユーザー自動作成
Redshiftのユーザーを自動作成とはReshift上に予めユーザーを作成していない状態でもJDBC URLにAutoCreate
オプションを付けることで自動的にReshiftユーザーを作成してそのユーザー情報を使ってRedshiftへの接続を行える機能です。Redshiftユーザーを自動作成するのでそのままではPUBLIC
グループになってしまうため先にRedshift上でグループを作成しそのグループに自動作成ユーザーを所属させるようにします。
Redshiftのユーザー自動作成を行うには以下の様に進めます。
- Redshiftで自動作成のユーザーを所属させるグループを作成する
- IAMユーザーのポリシーをユーザー自動作成用に修正する
- JDBC URLをユーザー自動作成用のものに書き換える
では早速設定を行っていきます。
Redshift上でグループを作成
はじめにユーザーの自動作成では接続をする際にグループを指定しないとPUBLIC
だけに所属することになるのでこのままではあまり使えません。したがって先にRedshiftでグループを作成しておき、そのグループに新ユーザーを追加するようすることで柔軟に権限管理を行えます。
今回はstg_readonly
グループを作成しstg
スキーマに対してselectだけの権限を付けて、新ユーザーにstg_readonly
グループを所属させます。
-- グループの作成 CREATE GROUP stg_readonly; -- SCHEMA利用権限付与 GRANT USAGE ON SCHEMA stg TO GROUP stg_readonly; -- table参照権限付与 GRANT SELECT ON ALL TABLES IN SCHEMA stg TO GROUP stg_readonly; ALTER default privileges IN SCHEMA stg GRANT SELECT ON tables TO GROUP stg_readonly;
Redshiftユーザー自動作成用のIAMポリシーの修正
次にRedshiftへのIAM認証接続を行うIAMユーザーにアタッチするポリシーを修正する必要があります。具体的にはRedshiftユーザーを作成するためのredshift:CreateClusterUser
アクションと自動作成したユーザーをRedshiftのグループに所属させるためのredshift:JoinGroup
アクションを許可する必要がります。これは公式ドキュメントにサンプルのポリシー( GetClusterCredentials を使用するポリシーの例 )があるのでこれを参考にします。
既存のRedshiftユーザーを使う場合のポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "redshift:GetClusterCredentials", "Resource": [ "arn:aws:redshift:{リージョン}:{アカウントID}:dbuser:{クラスター識別子}/user1", "arn:aws:redshift:{リージョン}:{アカウントID}:dbname:{クラスター識別子}/dev" ] } ] }
上記が既存のRedshiftユーザーを使うポリシーでしたがこれを以下のように修正します。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "GetClusterCredsStatement", "Effect": "Allow", "Action": [ "redshift:GetClusterCredentials" ], "Resource": [ "arn:aws:redshift:{リージョン}:{アカウントID}:dbuser:{クラスター識別子}/user2", "arn:aws:redshift:{リージョン}:{アカウントID}:dbname:{クラスター識別子}/dev", "arn:aws:redshift:{リージョン}:{アカウントID}:dbgroup:{クラスター識別子}/stg_readonly" ] }, { "Sid": "CreateClusterUserStatement", "Effect": "Allow", "Action": [ "redshift:CreateClusterUser" ], "Resource": [ "arn:aws:redshift:{リージョン}:{アカウントID}:dbuser:{クラスター識別子}/user2" ] }, { "Sid": "RedshiftJoinGroupStatement", "Effect": "Allow", "Action": [ "redshift:JoinGroup" ], "Resource": [ "arn:aws:redshift:{リージョン}:{アカウントID}:dbgroup:{クラスター識別子}/stg_readonly" ] } ] }
修正箇所としては以下になります。
redshift:GetClusterCredentials
アクションのリソースにdbgroupで自動作成ユーザーのグループを指定するredshift:CreateClusterUser
アクションのリソースで作成するユーザーを指定するredshift:JoinGroup
アクションのリソースで所属させるグループを指定する-
Amazon Redshift でのアイデンティティベースのポリシー (IAM ポリシー) の使用 - Amazon Redshift
JDBC URLをユーザー自動作成用のものに修正
Redshiftグループの作成と接続ユーザー用のポリシーが作成できたので接続を行います。接続する際にはJDBC URLにオプションを付ける必要があります。 認証情報については前回同様に.aws/credentials
に登録されたプロファイルを使って接続を行いますが、それに加えてRedshiftのユーザーを自動作成するAutoCreate
と作成したユーザーを所属させるグループを指定するDbGroups
を使用して以下のようなJDBC URLを作成します。
jdbc:redshift:iam://{クラスター識別子}:{リージョン}:5439/dev?Profile=cm_rs_iam&DbUser=user2&DbGroups=stg_readonly&AutoCreate=true
ここまでできたら後は前回同様DBeaverなりクライアントツールにて作成したJDBC URLを設定すればRedshiftのユーザーを新規作成した上でRedshiftに接続することができます。ちなみにRedshiftで自動作成されたユーザーはIAM:ユーザー名
という形でIAM認証で自動作成されたユーザーだと一目できる形式になっています。
今回の例では作成したRedshiftユーザーはstg_readonlyグループのみに所属させていますが、複数グループに所属させたい場合はIAMポリシーのリソースで複数グループを指定するのとJDBC URLのDbGroups
にカンマ区切りで複数グループを指定すること可能になります。
データベースユーザー認証情報を作成するための JDBC および ODBC のオプション - Amazon Redshift
まとめ
IAM認証を使用したRedshiftデータベースへの接続でユーザーの自動作成を行いました。IAMユーザーにRedshiftへの接続を行わせたい場合に都度Redshift上にて手作業でユーザーを作る必要はなくIAMポリシーの設定のみでユーザーを管理できるのはとても便利だと感じました。
最後まで読んで頂いてありがとうございました。